/**
 * @author Roderick Cusirramos Montesinos
 * @created Enero-2011
 * @see www.agileengine.com
*/
package diagram;

import java.awt.BasicStroke;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.GeneralPath;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;

/**
   A class that supplies convenience implementations for 
   a number of methods in the Edge interface type.
*/
public abstract class AbstractEdge implements Edge {
    public Object clone() {
        try {
            return super.clone();
        }
        catch (CloneNotSupportedException exception) {
            return null;
        }
    }

    public void connect(Node s, Node e) {
        start = s;
        end = e;
    }

    public Node getStart() {
        return start;
    }

    public Node getEnd() {
        return end;
    }

    public Rectangle2D getBounds(Graphics2D g2) {
        Line2D conn = getConnectionPoints();
        Rectangle2D r = new Rectangle2D.Double();
        r.setFrameFromDiagonal(conn.getX1(), conn.getY1(), conn.getX2(), conn.getY2());
        return r;
    }

    public Line2D getConnectionPoints() {
        Rectangle2D startBounds = start.getBounds();
        Rectangle2D endBounds = end.getBounds();
        Point2D startCenter = new Point2D.Double( startBounds.getCenterX(), startBounds.getCenterY());
        Point2D endCenter = new Point2D.Double( endBounds.getCenterX(), endBounds.getCenterY());
        return new Line2D.Double( start.getConnectionPoint(endCenter), end.getConnectionPoint(startCenter));
    }

    private Node start;
    private Node end;
    
}
